/**
 * bsw_auto_compliler.h
 * gnu gcc 的一些常见自带操作
 * 
 * 竹影半墙
 * 2023.10
 */
#ifndef BSW_AUTO_COMPILER_H
#define BSW_AUTO_COMPILER_H

#define bsw_likely          __glibc_likely
#define bsw_unlikely        __glibc_unlikely

#define bsw_inline          inline
#define bsw_always_inline   __always_inline

#define bsw_cas(v,o,n)      __sync_bool_compare_and_swap(v,o,n)
#define bsw_atomic_inc(v)   __sync_add_and_fetch(&v, 1)
#define bsw_atomic_dec(v)   __sync_sub_and_fetch(&v, 1)
#define bsw_atomic_fetch_add(a,v)  __sync_fetch_and_add(&a, v)
#define bsw_atomic_add_fetch(a,v)  __sync_add_and_fetch(&a, v)

typedef enum bsw_auto_run_prio bsw_auto_run_prio_e;
enum bsw_auto_run_prio {
   BSW_AUTO_RUN_PRIO HIGHEST = 101,
   BSW_AUTO_RUN_EVENT_CA,
   //BSW AUTO_RUN WHO...,
};

#define bsw_constructor(prio) __attribute__((constructor(prio)))
#define bsw_destructor(prio)  __attribute__((destructor(prio)))

#endif